package com.umfb.timertask.spider;
import java.io.BufferedInputStream;
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.LinkedHashSet;
import java.util.Scanner;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;



/**
 * 爬虫类
 */
public class Spider {
	public String crawling(Product product){
		StringBuffer sb=new StringBuffer();//缓存字符串,用于字符串的快速拼接
		String url="http://nc.mofcom.gov.cn/channel/jghq2017/price_list.shtml";//目标网站位置
		//开始拼接请求参数信息
		url+="?par_craft_index="+product.getPar_craft_index();//产品类别
		url+="&craft_index="+product.getCraft_index();//产品编号
		url+="&par_p_index="+product.getPar_p_index();//市场省份位置
		url+="&p_index="+product.getP_index();//市场详细位置
		url+="&startTime="+product.getStartTime();//起始时间
		url+="&endTime"+product.getEndTime();//终止时间
		url+="&page="+product.getPage();//当前页码

		String html=downLoadUrl(url);//获取目标html代码

		String table=parseHtml(html,SpiderRegex.TABLE_URL,1);//获取表格
		String tbody=parseHtml(table,SpiderRegex.TABLE_TBODY,1);//获取表格内容
		Set<String> trs=parseHtml(tbody,SpiderRegex.TABLE_TR);//获取表格中每行的内容

		for(String tr:trs){
			Set<String> tds=parseHtml(tr,SpiderRegex.TABLE_TD);//获取每行中每列的内容
			for(String td:tds){
				td=td.replaceAll("\t", "").replaceAll(" ", "");//将列中的制表符和空格都去除
				Set<String> mark=parseHtml(td,SpiderRegex.TABLE_TD_NONE);//查看是否为不处理数据
				if(mark.size()>0){//说明为不处理数据,跳过该次循环
					continue;
				}
				String addr=parseHtml(td,SpiderRegex.TABLE_TD_ADDR,1);//获取地址
				if(null!=addr && !"".equals(addr)){
					td=addr;//获取地址成功
				}
				sb.append(td+"\t");//添加该列信息
			}
			sb.append("\n");//添加换行符
		}
		if(trs.size()<14){
			sb.append("最后一页");
		}
		return sb.toString();
	}

	/**
	 * 拉取页面html代码
	 * @param addr
	 * @return
	 */
	private String downLoadUrl(String addr){
		StringBuffer sb=new StringBuffer();//缓存字符串,用于字符串的快速拼接
		try {
			URL url=new URL(addr);
			HttpURLConnection con=(HttpURLConnection) url.openConnection();//打开连接工具
			con.setConnectTimeout(5000);//设置超时时间
			con.connect();//建立连接
			if(con.getResponseCode()==200){//如果响应码为200,说明连接成功
				BufferedInputStream bis=new BufferedInputStream(con.getInputStream());
				Scanner sc=new Scanner(bis);
				while(sc.hasNextLine()){
					sb.append(sc.nextLine());//存储html信息
				}
			}
		} catch (MalformedURLException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return sb.toString();
	}

	/**
	 * 解析方法
	 * @param html
	 * @param regex
	 * @return 返回一个集合
	 */
	private Set<String> parseHtml(String html,String regex){
		Set<String> result=new LinkedHashSet<String>();
		//创建一个Pattern模式类,编译这个正则表达式
		Pattern p=Pattern.compile(regex,Pattern.CASE_INSENSITIVE);
		//定义一个匹配的类
		Matcher matcher=p.matcher(html);
		while(matcher.find()){
			result.add(matcher.group(1));
		}
		return result;
	}

	/**
	 * 重载解析方法
	 * @param html
	 * @param regex
	 * @param index 组的索引
	 * @return 返回特定组
	 */
	private String parseHtml(String html,String regex,int index){
		String result="";
		//创建一个Pattern模式类,编译这个正则表达式
		Pattern p=Pattern.compile(regex,Pattern.CASE_INSENSITIVE);
		//定义一个匹配的类
		Matcher matcher=p.matcher(html);
		while(matcher.find()){
			if(index<0 || index>matcher.groupCount()){//容错处理
				return "";
			}
			result=matcher.group(index);
		}
		return result;
	}

}
